package tk.mybatis.simple.mapper;

import org.apache.ibatis.annotations.Param;
import tk.mybatis.simple.model.SysRole;
import tk.mybatis.simple.model.SysUser;
import tk.mybatis.simple.model.SysUser2;

import java.util.List;
import java.util.Map;

/**
 * @author: tianhao.luo@hand-china.com 2021/1/28  23:01
 */
public interface SysUserMapper {

    /**
     * 通过id查用户
     *
     * @param id 用户id
     * @return 用户
     */
    SysUser queryById(Long id);

    /**
     * 查询所有用户
     *
     * @return 用户
     */
    List<SysUser> queryAll();


    /**
     * 插入用户
     *
     * @param user 用户
     * @return 执行的SQL影响的行数
     */
    int insert(SysUser user);

    /**
     * 插入用户，使用JDBC方式获取主键
     *
     * @param user 用户
     * @return 会返回插入记录的主键
     */
    int insert2(SysUser user);


    /**
     * 插入用户，使用selectKey方式获取主键
     *
     * @param user 用户
     * @return 会返回插入记录的主键
     */
    int insert3(SysUser user);


    /**
     * 根据主键更新
     *
     * @param user 用户记录
     * @return 执行得sql影响得行数
     */
    int updateById(SysUser user);

    /**
     * 根据主键删除
     *
     * @param user 用户记录
     * @return 执行得sql影响得行数
     */
    int deleteById(SysUser user);

    /**
     * 根据用户id和角色的enabled状态获取用户的角色
     *
     * @param userId 用户id主键
     * @param enabled 是否启用
     * @return 用户角色信息
     */
    List<SysRole> selectRoleByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);


    /**
     * 查询用户列表
     * @param user 条件
     * @return 用户列表
     */
    List<SysUser> selectByUser(SysUser user);

    /**
     * 根据主键更新
     * @param user 条件
     * @return 影响的行数
     */
    int updateByIdSelective(SysUser user);

    /**
     * 插入一条记录
     * @param user 条件
     * @return 影响的行数
     */
    int insert4(SysUser user);

    /**
     * 根据用户id或用户名查询
     * @param user 条件
     * @return 用户数据
     */
    SysUser selectByIdOrUserName(SysUser user);

    /**
     * 通过id查询用户列表
     * @param list id集合
     * @return 用户列表
     */
    List<SysUser> selectByIdList(List<Long> list);


    /**
     * 插入用户记录
     * @param userList 用户集合
     * @return 影响的行数
     */
    int insertList(List<SysUser> userList);

    /**
     * 通过map更新列
     * @param map 以表字段为key，值为value
     * @return 影响的行数
     */
    int updateByMap(Map<String,Object> map);

    /**
     * 根据用户id获取用户信息和用户的角色信息
     * @param id 用户id
     * @return 用户和角色信息
     */
    SysUser selectUserAndRoleById(Long id);

    /**
     * 根据用户id获取用户信息和用户的角色信息
     * @param id 用户id
     * @return 用户和角色信息
     */
    SysUser selectUserAndRoleById2(Long id);

    /**
     * 根据用户id获取用户信息和用户的角色信息
     * @param id 用户id
     * @return 用户和角色信息
     */
    SysUser selectUserAndRoleById3(Long id);

    /**
     * 通过association嵌套查询获取用户信息
     * @param id 用户主键
     * @return 用户和角色信息
     */
    SysUser selectUserAndRoleByIdSelect(Long id);

    /**
     * 查询所有用户对应的角色信息
     * @return 用户信息
     */
    List<SysUser2> selectAllUserAndRoles();


    /**
     * 查询所有用户对应的角色信息
     * @return 用户信息
     */
    List<SysUser2> selectAllUserAndRoles2();

    /**
     * 查询指定用户角色信息
     * @param id 用户主键
     * @return 角色信息
     */
    SysUser2 selectAllUserAndRolesSelect(Long id);
}
